package org.facyt.vacas.services.impl;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.facyt.vacas.dto.DatosDTO;
import org.facyt.vacas.dto.MpDTO;
import org.facyt.vacas.dto.RequerimientosNrcDTO;
import org.facyt.vacas.entities.vacas.Componente;
import org.facyt.vacas.entities.vacas.ComponenteValor;
import org.facyt.vacas.entities.vacas.MateriaPrima;
import org.facyt.vacas.entities.vacas.restricciones.Igual;
import org.facyt.vacas.entities.vacas.restricciones.Restriccion;
import org.facyt.vacas.entities.vacas.restricciones.RestriccionSimple;
import org.facyt.vacas.services.ComponenteService;
import org.facyt.vacas.services.MateriasPrimasService;
import org.facyt.vacas.services.ProcesarService;
import org.facyt.vacas.util.Constantes;

public class ProcesarServiceImpl implements ProcesarService {

	private static BigDecimal pv;
	private static BigDecimal leche;
	private static BigDecimal gb;
	private static BigDecimal pb;
	private static BigDecimal del;
	private static BigDecimal camina;
	private static int estres;
	private static BigDecimal cw;
	private static BigDecimal diasg;
	private static BigDecimal adpv;
	
	private static BigDecimal kgms;

	public static BigDecimal getKgms() {
		return kgms;
	}

	public static void setKgms(BigDecimal kgms) {
		ProcesarServiceImpl.kgms = kgms;
	}

	private static Integer animal;

	private static ArrayList<MpDTO> listaIdMP;
	private MateriasPrimasService mpService;
	private ComponenteService compService;

	public void setMpService(MateriasPrimasService mpService) {
		this.mpService = mpService;
	}

	public void setCompService(ComponenteService compService) {
		this.compService = compService;
	}

	public ArrayList<MpDTO> getListaIdMP() {
		return listaIdMP;
	}

	public void setListaIdMP(ArrayList<MpDTO> listaIdMP) {
		this.listaIdMP = listaIdMP;
	}

	/**
	 * 
	 * param id_movi param pv param leche param gb param pb param del param
	 * camina param estres param cw param diasg param adpv param animal param
	 * listaIdMP lista de los ids de las mp que utilizara el usuario. en
	 * principio 100 gr de alfalfa., id=X.
	 */
	public List<Restriccion> procesar(DatosDTO d, ArrayList<MpDTO> lista) {

		animal = new Integer(d.getIdtipoanimal());

		pv = d.getPv();
		leche = d.getLtsxdia();
		gb = d.getGb();
		pb = d.getPb();
		del = d.getDel();
		camina = d.getCamina();
		estres = d.getEstres();
		cw = d.getCw();
		diasg = d.getDiasgestacion();
		adpv = d.getAdpv();

		listaIdMP = lista;
		
		
		//calcular los valores de tdFdn, ee, ed, etc...para cada mp.
		
		 try {
			calculartd();
		
            calcularms_aporte();
		 } catch (Exception e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			
	

		// /1 = vaca seca, 2 = ordeñe y 3 =recria
		switch (animal.intValue()) {
		case 1:
			try {
				return getRestricciones( seca());
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				return null;
			}

		case 2:
			try {
				return getRestricciones( ordeñe());
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				return null;
			}

		case 3:
			try {
				return getRestricciones(recria());
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				return null;
			}

		default:
			return null;

		}

	}

	private List<Restriccion> getRestricciones(RequerimientosNrcDTO recriaDTO) {


			List<Restriccion> listaResultado = new ArrayList<Restriccion>();
			
			//TODO: ver si esta corresponde.
			//materia seca dela racion seleccionada
			//listaResultado.add(getR_ms_aporte());
			//ma. seca nrc: cms
			
			Componente c = null;
			try {
				c = compService.getComponenteById(Constantes.componente.CMS);
			
			
			listaResultado.add(recriaDTO.getR_cms(c));
			//listaResultado.add(getR_ms_aporte());

			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				System.err.println("no se eocntro el componenete CMS");
			}
			
			
			
			/**
			 * ENL_TotalCons.Text = Format(dr("ENL_TotalCons"), "#,###,##0.00")
	           ENL_TotalCons_nrc.Text = Format(dr("ENL_Total")
			 */
			
			//listaResultado.add(getR_enl_totalcons());
			c = null;
			try {
				c = compService.getComponenteById(Constantes.componente.ENL);
				listaResultado.add(recriaDTO.getR_enl_total(c));
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				System.err.println("no se eocntro el componenete CMS");
			}
			
			
			// 2 = ordeñe
			/**
			 * If Me.Session("animal") = "Vaca en Ordeñe" Then
	                Me.pb.Text = Format(dr("MCP_total"), "#,###,##0.00")
	            End If
	            **/
	        
			if(recriaDTO.getIdtipoanimal() == 2)
				listaResultado.add(recriaDTO.getR_pb_ordeñe());
	         
			/** 1 = vaca seca,
	            If Me.Session("animal") = "Vaca Seca" Then
	                Me.pb.Text = Format((dr("RDP") + dr("RUP")) / ms_aporte / 10, "#,###,##0.00")
	            End If

			 */
			if(recriaDTO.getIdtipoanimal() == 1)
				listaResultado.add(recriaDTO.getR_pb_seca());
			
			/**Me.pdr_req.Text = Format(dr("Pdr_req"), "#,###,##0.00")
		            Me.pdr_req_nrc.Text = Format(dr("rdp"), "#,###,##0.00")**/

			//55;"CMS"
			///////56;"EM"
			//57;"ENL"
			//58;"PDR"
			//59;"PM"
			//60;"FDN"

			c = null;
			try {
				c = compService.getComponenteById(Constantes.componente.PDR);
				listaResultado.add(recriaDTO.getR_rdp(c));
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				System.err.println("no se eocntro el componenete PDR");
			}
			
			
			c = null;
			try {
				c = compService.getComponenteById(Constantes.componente.PM);
				listaResultado.add(recriaDTO.getR_pm_total(c));
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				System.err.println("no se eocntro el componenete pm");
			}
			
			c = null;
			try {
				c = compService.getComponenteById(Constantes.componente.CALCIO);
				listaResultado.add(recriaDTO.getR_CALCIO(c));
				
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				System.err.println("no se eocntro el componenete CALCIO");
			}
			
			c = null;
			try {
				c = compService.getComponenteById(Constantes.componente.FOSFORO);
				listaResultado.add(recriaDTO.getR_fosforo(c));
				
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				System.err.println("no se encontro el componenete FOSFORO");
			}
			
			c = null;
			try {
				c = compService.getComponenteById(Constantes.componente.MAGNESIO);
				listaResultado.add(recriaDTO.getR_magnesio(c));
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				System.err.println("no se encontro el componenete magesio");
			}
			
			
			
			

		/*	listaResultado.add(getR_lc4());
			listaResultado.add(getR_lag());
			listaResultado.add(getR_a1());
			

			listaResultado.add(getR_enactiv());
			
			listaResultado.add(getR_enmnt());
			listaResultado.add(getR_enstress());

			listaResultado.add(getR_er());
			listaResultado.add(getR_enleche());
			listaResultado.add(getR_enl_total());
			
			listaResultado.add(getR_cms());
			
			listaResultado.add(getR_pdescepitelio());
			
			listaResultado.add(getR_porinareq());
			listaResultado.add(getR_pm_mnt());
			listaResultado.add(getR_pm_lact());
			listaResultado.add(getR_pm_total());
			listaResultado.add(getR_pdr_req());
			listaResultado.add(getR_porce_conce());
			listaResultado.add(getR_tdn_1());
			listaResultado.add(getR_cms_mnt());
			listaResultado.add(getR_tdn_conc());
			listaResultado.add(getR_disc_var());
			listaResultado.add(getR_desc_var());
			listaResultado.add(getR_tdn_act());
			listaResultado.add(getR_ed_cons());
			listaResultado.add(getR_eddesc_ms());
			listaResultado.add(getR_ee_ms());
			listaResultado.add(getR_em_ms());
			listaResultado.add(getR_enl_ms());
			listaResultado.add(getR_em_totalcons());
			listaResultado.add(getR_enl_totalcons());
			listaResultado.add(getR_mcp_total());
			listaResultado.add(getR_pct());
			listaResultado.add(getR_kpc());
			listaResultado.add(getR_kpf());
			listaResultado.add(getR_rdpx_forr());
			listaResultado.add(getR_rdpx_forr2());
			listaResultado.add(getR_rdpx_conc());
			listaResultado.add(getR_rdpx_conc2());
			listaResultado.add(getR_rdp());
			listaResultado.add(getR_rup());
			
			
			
			
			listaResultado.add(getR_pfecalmet());
			listaResultado.add(getR_pmendo());
			listaResultado.add(getR_pmpreg());
			listaResultado.add(getR_CALCIO());
			listaResultado.add(getR_fosforo());
			listaResultado.add(getR_magnesio());
			listaResultado.add(getR_sodio());
			listaResultado.add(getR_cloro());
			listaResultado.add(getR_potasio());
			listaResultado.add(getR_asufre());
			listaResultado.add(getR_cobalto());
			listaResultado.add(getR_cobre());
			listaResultado.add(getR_iodo());
			listaResultado.add(getR_hierro());
			listaResultado.add(getR_manganeso());
			listaResultado.add(getR_zinc());
			listaResultado.add(getR_selenio());
			listaResultado.add(getR_vit_a());
			listaResultado.add(getR_vit_d());
			listaResultado.add(getR_vit_e());
			listaResultado.add(getR_fdn());*/

			/// etc...

			for (int i = 0; i < listaResultado.size(); i++) {
				Restriccion r = listaResultado.get(i);
				System.out.println(r.getStringRestriccion());
			}
			
			return listaResultado;
		}

		private Restriccion getR_pb_seca() {
			//(dr("RDP") + dr("RUP")) / ms_aporte / 10
			
					Componente c = new Componente();
					//TODO: ver estoooo. que componente seria, o como armo la restroccion
					//falta id
					c.setDescripcion("pb");
					
			/*		r_rdp = new Igual();
					r_rdp.setComponente(c);
					((RestriccionSimple) r_rdp).setCantidad(getRdp().add(getRup()));
					r_rdp.setearEsF();
					return (Igual) r_rdp;*/
					return null;
		}

		private Restriccion getR_pb_ordeñe() {
			//"MCP_total"
			
			Componente c = new Componente();
			//TODO: ver estoooo. que componente seria, o como armo la restroccion
			//falta id
			c.setDescripcion("MCP_total");
			
		/*	r_mcp_total = new Igual();
			r_mcp_total.setComponente(c);
			((RestriccionSimple) r_mcp_total).setCantidad(getMcp_total());
			r_mcp_total.setearEsF();
			return (Igual) r_mcp_total;*/
			return null;
	
	}

	

	private void calcularms_aporte() {
	    kgms = BigDecimal.ZERO;
		if (listaIdMP != null && !listaIdMP.isEmpty()) {
			Iterator<MpDTO> i = listaIdMP.iterator();
			while(i.hasNext())
			{
			MpDTO dto = (MpDTO) i.next();
			if (dto != null) {

				kgms = kgms.add(dto.getCantidad());
			}
			}
		}
	}


	private RequerimientosNrcDTO recria() throws Exception {

		RequerimientosNrcDTO reqVacaRecria = new RequerimientosNrcDTO();

		BigDecimal div1 = new BigDecimal(37).divide(new BigDecimal(45), Constantes.presicion, Constantes.redondeomode);
		BigDecimal div2 =  new BigDecimal("0.14");
		BigDecimal div3 =  new BigDecimal("0.33");
		
		try {

			// Peso ternero al nacimiento
			BigDecimal cbw;
			cbw = BigDecimal.ZERO;

			// EM requerida para preñez
			BigDecimal empreg;
			if (diasg.compareTo(BigDecimal.ZERO) == 0)

				empreg = BigDecimal.ZERO;
			else
			{
				
				empreg = ((diasg.multiply(new BigDecimal(2)).multiply(new BigDecimal(0.00159)).subtract(new BigDecimal(0.0352))).multiply(div1)).divide(div2, Constantes.presicion, Constantes.redondeomode);
			}
			// Energia neta que gasta para actividad
			BigDecimal enactiv;
			//enactiv = (0.0009 * pv) + (0.0016 * pv);
			
			BigDecimal val1 = new BigDecimal("0.0009");
			BigDecimal val2 = new BigDecimal("0.0016");
			
			enactiv = (val1.multiply(pv).add(val2.multiply(pv)));

			// energia neta de mantenimiento
			BigDecimal enmnt;
			
		//	enmnt = java.lang.Math.pow(pv, 0.75) * 0.086;
			BigDecimal val3 = new BigDecimal("0.75");
			BigDecimal val4 = new BigDecimal("0.086");
			
			enmnt = new BigDecimal(java.lang.Math.pow(pv.doubleValue(), val3.doubleValue())).multiply(val4);

			// estres
			BigDecimal enstress = BigDecimal.ZERO;

			if (estres == 1)

				enstress = BigDecimal.ZERO;
			else if (estres == 2)

				enstress = new BigDecimal("0.07");

			else
				// if (estres == 3)
				enstress = new BigDecimal("0.18");

			// Energia Retenida ENGanancia
			BigDecimal er;
			/*er = 0.0635 * java.lang.Math.pow((pv * 0.96 * 0.891), 0.75) * java.lang.Math
					.pow((adpv * 0.96 * 0.956), 1.097);*/
			
			BigDecimal val5 = new BigDecimal("0.0635");
			BigDecimal val6 = new BigDecimal("0.96");
			BigDecimal val7 = new BigDecimal("0.891");
			BigDecimal val9 = new BigDecimal("0.956");
			
			BigDecimal val10 = val6.multiply(val7).multiply(pv);
			double val11 = java.lang.Math.pow(val10.doubleValue(), 0.75);
			BigDecimal val12 = adpv.multiply(val6).multiply(val9);
			
			double val13 = java.lang.Math.pow(val12.doubleValue(), 1.097);
			
			er = val5.multiply(new BigDecimal(val11)).multiply(new BigDecimal(val13));


			// Energia neta de lactancia requerida por dia para todos los
			// procesos
			BigDecimal enl_total;
			enl_total = empreg.add(enactiv).add(enmnt).add(enstress).add(er);

			// proteina
			BigDecimal pdescepitelio;
			pdescepitelio = new BigDecimal(java.lang.Math.pow(pv.doubleValue(), 0.6)).multiply(new BigDecimal("0.3"));

			BigDecimal porinareq;
			porinareq = new BigDecimal(java.lang.Math.pow(pv.doubleValue(), 0.5)).multiply(new BigDecimal("4.1"));

			// sumatoria de los kg. de masa seca
			BigDecimal MS_Aporte;
			MS_Aporte = getMS_Aporte();// (select sum(kg_ms) from alimentos
										// where id_movi = id_movi);
			//TODO: cantiad alimento.
			kgms = MS_Aporte;

			BigDecimal pmendo;
			pmendo = (MS_Aporte.multiply(new BigDecimal("11.8"))).multiply(new BigDecimal("0.4")).divide(new BigDecimal("0.67"), Constantes.presicion, Constantes.redondeomode);  // ((11.8 * MS_Aporte) * 0.4) / 0.67;

			BigDecimal pmpreg;
			pmpreg =   (diasg.multiply(new BigDecimal("0.69").subtract(new BigDecimal("69.2"))).multiply(div1) ).divide(div3, Constantes.presicion, Constantes.redondeomode);   ///((0.69 * diasg - 69.2) * (37 / 45)) / 0.33;

			// sumatoria de los kg. de alimentos concentrados
			BigDecimal tot_concentrados = BigDecimal.ZERO;
			try {
				tot_concentrados = getTotalConcenctrados(); // (select
															// sum(kg_ms) from
															// alimentos where
															// energia =
															// 'Concentrado' and
															// id_movi =
															// id_movi)
			} catch (Exception e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}

			// % de concentrados en la dieta que hacemos
			BigDecimal porce_conce;
			porce_conce = tot_concentrados.divide(MS_Aporte, Constantes.presicion, Constantes.redondeomode).multiply(new BigDecimal(100));

			// Aporte de Total de nutrientes digestibles para mantenimiento,
			// kg/dia
			BigDecimal tdn_1;
			tdn_1 = getTDN().divide(new BigDecimal(100), Constantes.presicion, Constantes.redondeomode); // (select sum(kg_ms * tdn) from alimentos
									// where id_movi = id_movi) / 100

			// Consumo de Materia seca que usa solo para mantenerse, el resto es
			// para producir
			BigDecimal cms_mnt;
			double div4 = java.lang.Math.pow((pv.doubleValue() * 0.96), 0.75);
			double div44 = div4 * 0.035;
			cms_mnt = tdn_1.divide(new BigDecimal(div44), Constantes.presicion, Constantes.redondeomode);     //tdn_1 / (0.035 * java.lang.Math.pow((pv * 0.96), 0.75));

			// % que representa el TDN sobre el Aporte de MS
			BigDecimal tdn_conc;
			tdn_conc = tdn_1.divide(MS_Aporte, Constantes.presicion, Constantes.redondeomode).multiply(new BigDecimal(100));  //tdn_1 / MS_Aporte * 100;

			BigDecimal disc_var;
			//disc_var = ((0.18 * tdn_conc) - 10.3) * (cms_mnt - 1);
			disc_var =  tdn_conc.multiply(new BigDecimal("0.18")).subtract(new BigDecimal("10.3")).multiply(cms_mnt.subtract(new BigDecimal(1))); 

			BigDecimal desc_var;
			//desc_var = (tdn_conc - disc_var) / tdn_conc;
			desc_var = (tdn_conc.subtract(disc_var)).divide(tdn_conc, Constantes.presicion, Constantes.redondeomode);

			// Aporte de TDN Real despues del descuento
			BigDecimal tdn_act;
			//tdn_act = tdn_conc * desc_var;
			tdn_act = tdn_conc.multiply(desc_var);

			// sumatoria kg MS de alimento * Energia Digestible que aporta
			BigDecimal ed_cons;
			ed_cons = getEd();// (select sum(kg_ms * ed) from alimentos where
								// id_movi = id_movi)

			// Energia Digestible Real con Descuento por kg materia seca
			BigDecimal eddesc_ms;
			//eddesc_ms = (ed_cons / MS_Aporte) * desc_var;
			eddesc_ms = (ed_cons.divide(MS_Aporte, Constantes.presicion, Constantes.redondeomode)).multiply(desc_var);

			// sumatoria kg MS de alimento * Extracto etereo del alimento
			BigDecimal ee_ms;
			//ee_ms = getEe_ms() / MS_Aporte;
			ee_ms = getEe_ms().divide(MS_Aporte, Constantes.presicion, Constantes.redondeomode); // (select sum(kg_ms * ee) from
											// alimentos where id_movi =
											// id_movi) / MS_Aporte

			BigDecimal em_ms;
			//em_ms = (1.01 * eddesc_ms - 0.45) + (0.0046 * (ee_ms - 1));
			em_ms = (new BigDecimal("1.01").multiply(eddesc_ms)).subtract(new BigDecimal("0.45")).add(new BigDecimal("0.0046").multiply(ee_ms.subtract(new BigDecimal(1))));

			BigDecimal enl_ms;
			//enl_ms = (0.703*EM_MS)-0.19
			
			BigDecimal val14 = (new BigDecimal("0.703").multiply(em_ms));
//			double val15 = java.lang.Math.pow(em_ms.doubleValue(), 2);
//			BigDecimal val17 = new BigDecimal("0.138").multiply(new BigDecimal(val15));
//
//			double val16 = java.lang.Math.pow(em_ms.doubleValue(), 3);
//			BigDecimal val18 = new BigDecimal("0.0105").multiply(new BigDecimal(val16));
			
			//enl_ms = val14.subtract(val17).add(val18).subtract(new BigDecimal("1.65"));
			
			BigDecimal val17 = new BigDecimal("0.19");
			enl_ms = val14.subtract(val17);

			BigDecimal enman;			
	//		enman = 1.37 * em_ms - 0.138 * java.lang.Math.pow(em_ms, 2)+ 0.0105 * java.lang.Math.pow(em_ms, 3) - 1.65;
			enman = enl_ms;

			BigDecimal cms;
			//en excel ´((PV*0.96)^0.75)*((0.2435*ENL_MS-0.0466*(ENL_MS^2)-0.1128)/(ENL_MS*0.9))
			//cms = java.lang.Math.pow((pv*0.96), 0.75) * (((0.2435 * enman)- (0.0466 * java.lang.Math.pow(enman, 2)) - 0.11));
			double valpv = pv.doubleValue() * 0.96;
			double val20 = java.lang.Math.pow(valpv, 0.75);
			double val21 = java.lang.Math.pow(enl_ms.doubleValue(), 2);
			BigDecimal val23 = new BigDecimal("0.2435").multiply(enl_ms);
			BigDecimal val24 = (new BigDecimal("0.0466")).multiply(new BigDecimal(val21));
			BigDecimal val25 = val23.subtract(val24).subtract(new BigDecimal("0.11"));
			BigDecimal valenl = enl_ms.multiply(new BigDecimal("0.9")); 
			cms = (new BigDecimal(val20)).multiply(val25.divide(valenl, Constantes.presicion, Constantes.redondeomode));
			// estaba asi en el .net: cms = java.lang.Math.pow((pv * 0.96),0.75)*(((0.2435*enl_ms)-(0.0466*java.lang.Math.pow(enl_ms,2))-0.11));
			

			// Consumo total de energía Metabolizable, Mcal/día
			BigDecimal em_totalcons;
			//em_totalcons = MS_Aporte * em_ms;
			em_totalcons = MS_Aporte.multiply(em_ms);

			// Consumo total de energía Neta de lactancia, Mcal/día
			BigDecimal enl_totalcons;
			//enl_totalcons = MS_Aporte * enl_ms;
			enl_totalcons = MS_Aporte.multiply(enl_ms);

			// porte de PM microbiana dietaria
			BigDecimal mcp_total;
			//mcp_total = 0.13 * (tdn_1 * desc_var) * 1000;
			mcp_total = (new BigDecimal("0.13")).multiply(tdn_1.multiply(desc_var)).multiply(new BigDecimal(1000));

			BigDecimal pct;
			//pct = getPct() * 10; // (select sum(kg_ms * pc) from alimentos where
									// id_movi = id_movi) * 10			
			pct = getPct().multiply(new BigDecimal(10)); 

			BigDecimal pfecalmet;
			//pfecalmet = (MS_Aporte * 30) - 0.5	* (((mcp_total * .64) / 0.8) - (mcp_total * .64));
			BigDecimal val29 = (MS_Aporte.multiply(new BigDecimal(30)));
			BigDecimal val26 = (mcp_total.multiply(new BigDecimal("0.64"))).divide(new BigDecimal("0.8"), Constantes.presicion, Constantes.redondeomode);
			BigDecimal val27 = mcp_total.multiply(new BigDecimal("0.64"));
			pfecalmet = val29.subtract((new BigDecimal("0.5").multiply(val26.subtract(val27))));

			BigDecimal pm_mnt;
			//pm_mnt = pdescepitelio + porinareq + pfecalmet + pmendo + pmpreg;
			pm_mnt = pdescepitelio.add(porinareq).add(pfecalmet).add(pmendo).add(pmpreg);

			BigDecimal pmgain;
			//pmgain = (adpv * (268 - (29.4 * (er / adpv))))	/ (0.834 - (478 * 0.00114));
			
			BigDecimal valoro = er.divide(adpv, Constantes.presicion, Constantes.redondeomode);
			BigDecimal val32 = new BigDecimal("29.4").multiply(valoro);
			BigDecimal val30 = new BigDecimal(268).subtract(val32);
			BigDecimal val33 = adpv.multiply(val30);
			BigDecimal val31 = new BigDecimal("0.834").subtract(new BigDecimal(478).multiply(new BigDecimal("0.00114")));
			pmgain = val33.divide(val31, Constantes.presicion, Constantes.redondeomode);

			BigDecimal pm_total;
			//pm_total = pm_mnt + pmgain;
			pm_total = pm_mnt.add(pmgain);

			BigDecimal pdr_req;
			//pdr_req = mcp_total * 1.18;
			pdr_req = mcp_total.multiply(new BigDecimal("1.18"));

			BigDecimal kpc;
			//kpc = 2.904 + (1.375 * cms_mnt) - (0.02 * porce_conce);
			kpc = new BigDecimal("2.904").add((new BigDecimal("1.375").multiply(cms_mnt)).subtract((new BigDecimal("0.02").multiply(porce_conce))));

			BigDecimal kpf;
			//kpf = 3.054 + (0.614 * cms_mnt);
			kpf = new BigDecimal("3.054").add((new BigDecimal("0.614").multiply(cms_mnt)));

			// //------- Calculo rdp ----------------
			BigDecimal rdp = BigDecimal.ZERO;

			rdp = getRDPrecreia(kpf);

			BigDecimal rup;
			//rup = pct - rdp;
			rup = pct.subtract(rdp);

			// Minerales
			BigDecimal calcio;
			/*calcio = (1.54 * (pv / 100))+ (0.08 * (pv / 100))+ (9.83 * java.lang.Math.pow(600, 0.22) * java.lang.Math.pow(pv, -0.22)) * (adpv / 0.96);*/

			BigDecimal val38 = new BigDecimal(1.54).multiply(pv.divide(new BigDecimal(100), Constantes.presicion, Constantes.redondeomode));
			BigDecimal val39 = new BigDecimal(0.08).multiply(pv.divide(new BigDecimal(100), Constantes.presicion, Constantes.redondeomode));
			double val34 = java.lang.Math.pow(600, 0.22);
			double val35 = java.lang.Math.pow(pv.doubleValue(), -0.22);
			BigDecimal val36 = (new BigDecimal(9.83)).multiply(new BigDecimal(val34)).multiply(new BigDecimal(val35));
			BigDecimal val37 = val36.multiply(adpv.divide(new BigDecimal(0.96), Constantes.presicion, Constantes.redondeomode));
			calcio = val38.add(val39).add(val37);
			
			BigDecimal fosforo;
			/*fosforo = (0.8 * MS_Aporte)+ (0.002 * pv)+
			 *  ((1.2 + (4.635 * java.lang.Math.pow(600, 0.22) * java.lang.Math.pow(pv, -0.22))) * (adpv / 0.96));*/

			BigDecimal val40 = (MS_Aporte.multiply(new BigDecimal(0.8)));
			BigDecimal val41 = (pv.multiply(new BigDecimal(0.002)));
			double val42 = java.lang.Math.pow(600, 0.22);
			double val43 = java.lang.Math.pow(pv.doubleValue(), -0.22);
			BigDecimal val44 = (new BigDecimal(4.635)).multiply(new BigDecimal(val42)).multiply(new BigDecimal(val43));
			BigDecimal val45 = (new BigDecimal(1.2)).add(val44);
			BigDecimal val46 = val45.multiply(adpv.divide(new BigDecimal(0.96), Constantes.presicion, Constantes.redondeomode));
			fosforo = val40.add(val41).add(val46);
			
			
			BigDecimal magnesio;
			//magnesio = (0.003 * pv) + (0.45 * (adpv / 0.96));
			BigDecimal val47 = (pv.multiply(new BigDecimal(0.003)));
			BigDecimal val48 = (new BigDecimal(0.45)).multiply(adpv.divide(new BigDecimal(0.96), Constantes.presicion, Constantes.redondeomode));
			magnesio = val47.add(val48);

			BigDecimal sodio;
			//sodio = (0.015 * pv) + (0.1 * (pv / 100)) + (1.4 * (adpv / 0.96));
			BigDecimal val49 = (pv.multiply(new BigDecimal(0.015)));
			BigDecimal val50 = (new BigDecimal(0.1)).multiply(adpv.divide(new BigDecimal(100), Constantes.presicion, Constantes.redondeomode));
			BigDecimal val51 = (new BigDecimal(1.4)).multiply(adpv.divide(new BigDecimal(0.96), Constantes.presicion, Constantes.redondeomode));
			sodio = val49.add(val50).add(val51);

			BigDecimal cloro;
			//cloro = (2.25 * (pv / 100)) + (1 * (adpv / 0.96));
			BigDecimal val52 = (new BigDecimal("2.25")).multiply(pv.divide(new BigDecimal(100), Constantes.presicion, Constantes.redondeomode));
			BigDecimal val53 = (new BigDecimal(1)).multiply(adpv.divide(new BigDecimal("0.96"), Constantes.presicion, Constantes.redondeomode));
			cloro = val52.add(val53);

			BigDecimal potasio;
			//potasio = (2.6 * MS_Aporte) + (0.038 * pv) + (0.04 * (pv / 100))+ (1.6 * (adpv / 0.96));
			
			BigDecimal val54 = (pv.multiply(new BigDecimal("0.038")));
			BigDecimal val55 = (MS_Aporte.multiply(new BigDecimal("2.6")));
			BigDecimal val56 = (new BigDecimal("0.04")).multiply(pv.divide(new BigDecimal(100), Constantes.presicion, Constantes.redondeomode));
			BigDecimal val57 = (new BigDecimal("1.6")).multiply(adpv.divide(new BigDecimal("0.96"), Constantes.presicion, Constantes.redondeomode));
			potasio = val54.add(val55).add(val56).add(val57);

			BigDecimal asufre;
			//asufre = 2 * MS_Aporte;
			asufre = MS_Aporte.multiply(new BigDecimal(2));

			BigDecimal cobalto;
			//cobalto = 0.11 * MS_Aporte;
			cobalto = MS_Aporte.multiply(new BigDecimal("0.11"));

			BigDecimal cobre;
			//cobre = (0.0071 * pv) + (1.15 * (adpv / 0.96));
			BigDecimal val58 = (pv.multiply(new BigDecimal("0.0071")));
			BigDecimal val59 = (new BigDecimal("1.15")).multiply(adpv.divide(new BigDecimal("0.96"), Constantes.presicion, Constantes.redondeomode));
			cobre = val58.add(val59);

			BigDecimal iodo;
			//iodo = 0.6 * (pv / 100);
			iodo  = (new BigDecimal(0.6)).multiply(pv.divide(new BigDecimal(100), Constantes.presicion, Constantes.redondeomode));

			BigDecimal hierro;
			//hierro = 34 * (adpv / 0.96);
			hierro =  (new BigDecimal(34)).multiply(adpv.divide(new BigDecimal("0.96"), Constantes.presicion, Constantes.redondeomode));

			BigDecimal manganeso;
			//manganeso = (0.002 * pv) + (0.7 * (adpv / 0.96));
			BigDecimal val60 = (pv.multiply(new BigDecimal("0.002")));
			BigDecimal val61 = (new BigDecimal("0.7")).multiply(adpv.divide(new BigDecimal("0.96"), Constantes.presicion, Constantes.redondeomode));
			manganeso =  val60.add(val61);

			BigDecimal zinc;
			//zinc = (0.033 * pv) + (0.012 * pv) + (24 * (adpv / 0.96));
			BigDecimal val62 = (pv.multiply(new BigDecimal("0.033")));
			val62.setScale(Constantes.presicion, Constantes.redondeomode);
			BigDecimal val63 = (pv.multiply(new BigDecimal("0.012")));
			BigDecimal val64 = (new BigDecimal(24)).multiply(adpv.divide(new BigDecimal("0.96"), Constantes.presicion, Constantes.redondeomode));
			zinc = val62.add(val63).add(val64);

			BigDecimal selenio;
			//selenio = 0.3 * MS_Aporte;
			selenio = MS_Aporte.multiply(new BigDecimal("0.3"));
			
			BigDecimal vit_a;
			//vit_a = 0.08 * pv;
			vit_a =  (pv.multiply(new BigDecimal("0.08")));

			BigDecimal vit_d;
			//vit_d = 0.03 * pv;
			vit_d =  (pv.multiply(new BigDecimal("0.03")));

			BigDecimal vit_e;
			//vit_e = 0.8 * pv;
			vit_e =  (pv.multiply(new BigDecimal("0.8")));

			BigDecimal fdn;
			fdn = getFdn(); // (select sum(kg_ms * (fdn/100)) as fdn from
							// alimentos where id_movi = id_movi)

			// // estas son variables que se usan en ordeñe
			BigDecimal a1, lag, lc4, enleche, pm_lact;
			BigDecimal rdpx_forr, rdpx_forr2, rdpx_conc, rdpx_conc2;
			a1 = BigDecimal.ZERO;
			lag = BigDecimal.ZERO;
			lc4 = BigDecimal.ZERO;
			enleche = BigDecimal.ZERO;
			pm_lact = BigDecimal.ZERO;
			rdpx_forr = BigDecimal.ZERO;
			rdpx_forr2 = BigDecimal.ZERO;
			rdpx_conc = BigDecimal.ZERO;
			rdpx_conc2 = BigDecimal.ZERO;

			reqVacaRecria.setIdtipoanimal(animal);
			reqVacaRecria.setPv(pv);
			reqVacaRecria.setLtsxdia(leche);
			reqVacaRecria.setGb(gb);
			reqVacaRecria.setPb(pb);
			reqVacaRecria.setCamina(camina);
			reqVacaRecria.setEstres(estres);
			reqVacaRecria.setCw(cw);
			reqVacaRecria.setDiasgestacion(diasg);
			reqVacaRecria.setAdpv(adpv);
			reqVacaRecria.setLc4(lc4);
			reqVacaRecria.setLag(lag);
			reqVacaRecria.setA1(a1);
			reqVacaRecria.setEnactiv(enactiv);
			reqVacaRecria.setEnmnt(enmnt);
			reqVacaRecria.setEnstress(enstress);

			reqVacaRecria.setEr(er);
			reqVacaRecria.setEnleche(enleche);
			
			reqVacaRecria.setEnl_total(enl_total);
			
			reqVacaRecria.setCms(cms);
			reqVacaRecria.setPdescepitelio(pdescepitelio);
			reqVacaRecria.setPorinareq(porinareq);

			reqVacaRecria.setPm_mnt(pm_mnt);
			reqVacaRecria.setPm_lact(pm_lact);
			
			reqVacaRecria.setPm_total(pm_total);
			
			reqVacaRecria.setPdr_req(pdr_req);
			reqVacaRecria.setPorce_conce(porce_conce);
			reqVacaRecria.setTdn_1(tdn_1);
			reqVacaRecria.setCms_mnt(cms_mnt);
			reqVacaRecria.setTdn_conc(tdn_conc);
			reqVacaRecria.setDisc_var(disc_var);
			reqVacaRecria.setDesc_var(desc_var);
			reqVacaRecria.setTdn_act(tdn_act);
			reqVacaRecria.setEd_cons(ed_cons);
			reqVacaRecria.setEddesc_ms(eddesc_ms);
			reqVacaRecria.setEe_ms(ee_ms);
			reqVacaRecria.setEm_ms(em_ms);
			reqVacaRecria.setEnl_ms(enl_ms);
			reqVacaRecria.setEm_totalcons(em_totalcons);
			reqVacaRecria.setEnl_totalcons(enl_totalcons);
			reqVacaRecria.setMcp_total(mcp_total);
			reqVacaRecria.setPct(pct);
			reqVacaRecria.setKpc(kpc);
			reqVacaRecria.setKpf(kpf);
			reqVacaRecria.setRdpx_forr(rdpx_forr);
			reqVacaRecria.setRdpx_forr2(rdpx_forr2);
			reqVacaRecria.setRdpx_conc(rdpx_conc);
			reqVacaRecria.setRdpx_conc2(rdpx_conc2);
			reqVacaRecria.setRdp(rdp);
			reqVacaRecria.setRup(rup);
		
			reqVacaRecria.setMs_aporte(MS_Aporte);
			
			reqVacaRecria.setPfecalmet(pfecalmet);
			reqVacaRecria.setPmendo(pmendo);
			
			reqVacaRecria.setCALCIO(calcio);
			reqVacaRecria.setFosforo(fosforo);
			reqVacaRecria.setMagnesio(magnesio);
			
			reqVacaRecria.setSodio(sodio);
			reqVacaRecria.setCloro(cloro);
			reqVacaRecria.setPotasio(potasio);
			reqVacaRecria.setAsufre(asufre);
			reqVacaRecria.setCobalto(cobalto);
			reqVacaRecria.setCobre(cobre);
			reqVacaRecria.setIodo(iodo);
			reqVacaRecria.setHierro(hierro);
			reqVacaRecria.setManganeso(manganeso);
			reqVacaRecria.setZinc(zinc);
			reqVacaRecria.setSelenio(selenio);
			reqVacaRecria.setVit_a(vit_a);
			reqVacaRecria.setVit_d(vit_d);
			reqVacaRecria.setVit_e(vit_e);
		
			reqVacaRecria.setFdn(fdn);

		} catch (Exception e) {
			throw e;
		}

		// rellenar resultado
		return reqVacaRecria;

	}

	/**
	 * // BigDecimal kg_ms, pc , pc_a, pc_b , kd ; // declare cur_rdp cursor for //
	 * select kg_ms, pc, pc_a, pc_b, kd from alimentos where id_movi = id_movi
	 * // open cur_rdp // FETCH NEXT FROM cur_rdp // into kg_ms, pc, pc_a, pc_b,
	 * kd // // WHILE FETCH_STATUS = 0 // begin // rdp = rdp +
	 * (KG_MS*PC/100)*(PC_a+PC_b*(kd/(kd+KPf)))*10 // FETCH NEXT FROM cur_rdp //
	 * into kg_ms, pc, pc_a, pc_b, kd // end // CLOSE cur_rdp // DEALLOCATE
	 * cur_rdp // --------- fin cálculo rdp ------------
	 * 
	 * @param kpf
	 * @return
	 */
	private BigDecimal getRDPrecreia(BigDecimal kpf) throws Exception {

		BigDecimal rdp = BigDecimal.ZERO;

		if (listaIdMP != null && !listaIdMP.isEmpty()) {
			Iterator<MpDTO> i = listaIdMP.iterator();
			while(i.hasNext())
			{
			MpDTO dto = (MpDTO) i.next();
			if (dto != null) {
				//Integer id = dto.getMp().getId();

				MateriaPrima mp = dto.getMp(); // mpService.getMateriaPrimaById(id);

				BigDecimal kg_ms = dto.getCantidad();
				ComponenteValor pc_cv = mpService
						.getComponenteFromComposicion(mp, compService
								.getComponenteById(Constantes.componente.PC));
				ComponenteValor pc_a_cv = mpService
						.getComponenteFromComposicion(mp, compService
								.getComponenteById(Constantes.componente.PC_a));
				ComponenteValor pc_b_cv = mpService
						.getComponenteFromComposicion(mp, compService
								.getComponenteById(Constantes.componente.PC_b));
				ComponenteValor kd_cv = mpService
						.getComponenteFromComposicion(mp, compService
								.getComponenteById(Constantes.componente.Kd));

				BigDecimal pc = pc_cv.getCantidad();
				BigDecimal pc_a = pc_a_cv.getCantidad();
				BigDecimal pc_b = pc_b_cv.getCantidad();
				BigDecimal kd = kd_cv.getCantidad();

				//rdp = rdp + (kg_ms * pc / 100)	* (pc_a + pc_b * (kd / (kd + kpf))) * 10;
				BigDecimal val1 = (kg_ms.multiply(pc).divide(new BigDecimal(100), Constantes.presicion, Constantes.redondeomode));
			    BigDecimal val2 = (pc_a.add(pc_b.multiply(kd.divide(kd.add(kpf), Constantes.presicion, Constantes.redondeomode)))).multiply(new BigDecimal(10));
				
				rdp = rdp.add(val1.multiply(val2)); 
			}
			}
		}
		return rdp;

	}

	private RequerimientosNrcDTO ordeñe() throws Exception {
		RequerimientosNrcDTO reqVacaOrdeñe = new RequerimientosNrcDTO();
		/*try {
			// leche corregida al 4 %
			BigDecimal lc4 = 0.4 * leche + 15 * (gb / 100) * leche;

			// factor de reduccion del consumo según los dias de lactancia
			BigDecimal lag = 1 - java.lang.Math.pow(2.71828182845904,
					((-1 * 0.192 * ((del / 7) + 3.67))));

			BigDecimal a1 = 0.08;

			// Energia neta que gasta para actividad
			BigDecimal enactiv;
			enactiv = (camina * 0.00045 * pv) + (0.0012 * pv);

			// energia neta de mantenimiento
			BigDecimal enmnt;
			enmnt = java.lang.Math.pow((pv - cw), 0.75) * a1;

			BigDecimal enstress;
			// estres

			if (estres == 1)

				enstress = 0;
			else if (estres == 2)

				enstress = 0.07;

			else
				// if (estres == 3)
				enstress = 0.18;

			// Energia neta de lactancia
			BigDecimal enleche;
			enleche = leche * ((0.0929 * gb) + (0.0547 * pb) + 0.192);

			// Energia neta de lactancia requerida por dia para todos los
			// procesos
			BigDecimal enl_total;
			enl_total = enactiv + enmnt + enstress + enleche;

			BigDecimal cms;
			cms = ((java.lang.Math.pow(pv, 0.75) * 0.0968) + (0.372 * lc4) - 0.293)
					* lag;

			// proteina
			BigDecimal pdescepitelio;
			pdescepitelio = 0.3 * java.lang.Math.pow((pv - cw), 0.6);

			BigDecimal porinareq;
			porinareq = 4.1 * java.lang.Math.pow((pv - cw), 0.5);

			BigDecimal alimento;

			// sumatoria de los kg. de masa seca
			BigDecimal MS_Aporte;
			MS_Aporte = getMS_Aporte(); // (select sum(kg_ms) from alimentos
										// where id_movi = id_movi);

			// sumatoria de los kg. de alimentos concentrados
			BigDecimal tot_concentrados = 0;
			try {
				tot_concentrados = getTotalConcenctrados(); // (select
															// sum(kg_ms) from
															// alimentos where
															// energia =
															// 'Concentrado' and
															// id_movi =
															// id_movi)
			} catch (Exception e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}

			// % de concentrados en la dieta que hacemos
			BigDecimal porce_conce;
			porce_conce = tot_concentrados / MS_Aporte * 100;

			// Aporte de Total de nutrientes digestibles para mantenimiento,
			// kg/dia
			BigDecimal tdn_1;
			tdn_1 = getTDN() / 100; // (select sum(kg_ms * tdn) from alimentos
									// where id_movi = id_movi) / 100

			// Consumo de Materia seca que usa solo para mantenerse, el resto es
			// para producir
			BigDecimal cms_mnt;
			cms_mnt = tdn_1 / (0.035 * (java.lang.Math.pow((pv * 0.96), 0.75)));

			// % que representa el TDN sobre el Aporte de MS
			BigDecimal tdn_conc;
			tdn_conc = tdn_1 / MS_Aporte * 100;

			BigDecimal disc_var;
			disc_var = ((0.18 * tdn_conc) - 10.3) * (cms_mnt - 1);

			// Unidad * veces MNT
			BigDecimal desc_var;
			desc_var = (tdn_conc - disc_var) / tdn_conc;

			// Aporte de TDN Real despues del descuento
			BigDecimal tdn_act;
			tdn_act = tdn_conc * desc_var;

			// sumatoria kg MS de alimento * Energia Digestible que aporta
			BigDecimal ed_cons;
			ed_cons = getEd(); // (select sum(kg_ms*ed) from alimentos where
								// id_movi = id_movi)

			// Energia Digestible Real con Descuento por kg materia seca
			BigDecimal eddesc_ms;
			eddesc_ms = (ed_cons / MS_Aporte) * desc_var;

			// sumatoria kg MS de alimento * Extracto etereo del alimento
			BigDecimal ee_ms;
			ee_ms = getEe_ms_Ordeñe(); // (select sum(kg_ms * ee) / sum(kg_ms)
										// from alimentos where id_movi =
										// id_movi)

			BigDecimal em_ms;
			em_ms = (1.01 * eddesc_ms - 0.45) + (0.0046 * (ee_ms - 1));

			BigDecimal enl_ms;
			enl_ms = (0.703 * em_ms) - 0.19;

			// Consumo total de energía Metabolizable, Mcal/día
			BigDecimal EM_TotalCons;
			EM_TotalCons = MS_Aporte * em_ms;

			// Consumo total de energía Neta de lactancia, Mcal/día
			BigDecimal ENL_TotalCons;
			ENL_TotalCons = MS_Aporte * enl_ms;

			// aporte de PM microbiana dietaria
			BigDecimal mcp_total;
			mcp_total = 0.13 * (tdn_1 * desc_var) * 1000;

			// aporte de PC total grs / dia
			BigDecimal PCt;
			PCt = getPct_ordeñe();// (select sum(kg_ms * pc) * 10 from alimentos
									// where id_movi = id_movi)

			// Tasa de pasaje de concentrados %/hora
			BigDecimal KPc;
			KPc = 2.904 + (1.375 * cms_mnt) - (0.02 * porce_conce);

			// Tasa de pasaje de los forrajes %/hora
			BigDecimal KPf;
			KPf = 3.054 + (0.614 * cms_mnt);

			// PREGUNTAR COMO MIERDA SE CALCULA
			// Total aporte de Prot degradable ruminal gramos por dia
			BigDecimal RDP;
			RDP = getRDP_ordeñe(KPf); // (select SUM((KG_MS *
										// PC/100)*(PC_a+PC_b*(kd/(kd+KPf)))*10)
										// from alimentos where id_movi =
										// id_movi)

			// Total aporte de Prot NO degradable ruminal gramos por dia
			BigDecimal rup;
			rup = PCt - RDP;

			// proteina fecal metabolica
			BigDecimal PFecalMet;
			PFecalMet = (MS_Aporte * 30) - 0.5
					* (((mcp_total * .64) / 0.8) - (mcp_total * .64));

			BigDecimal PMEndo;
			PMEndo = ((11.8 * MS_Aporte) * 0.4) / 0.67;

			// Proteina Metabolizable para Mantenimiento, gr/dia pm_mnt
			BigDecimal pm_mnt;
			pm_mnt = pdescepitelio + porinareq + PFecalMet + PMEndo;

			// proteina Metabolizable g/dia
			BigDecimal pm_lact;
			pm_lact = (leche * pb / 100) / 0.67 * 1000;

			// Proteina Metabolizable total g/dia
			BigDecimal pm_total;
			pm_total = pm_mnt + pm_lact;

			// Proteina degradable Ruminal requerida en grs/dia
			BigDecimal pdr_req;
			pdr_req = mcp_total * 1.18;

			// - PREGUNTAR COMO CALCULAR ESTO
			BigDecimal rdpx_forr, rdpx_forr2, rdpx_conc, rdpx_conc2;
			rdpx_forr = 0;
			rdpx_forr2 = 0;
			rdpx_conc = 0;
			rdpx_conc2 = 0;
			// //- Minerales
			BigDecimal calcio;
			calcio = (3.1 * (pv / 100)) + 1.22 * leche;

			BigDecimal fosforo;
			fosforo = 1 * MS_Aporte + 0.002 * pv + 0.9 * leche;

			BigDecimal magnesio;
			magnesio = 0.003 * pv + 0.15 * leche;

			BigDecimal sodio;
			sodio = 0.038 * pv + (0.1 * (pv / 100)) + (0.63 * leche);

			BigDecimal cloro;
			cloro = (2.25 * (pv / 100)) + 1.15 * leche;

			BigDecimal potasio;
			potasio = (6.1 * MS_Aporte) + (0.038 * pv) + (0.04 * (pv / 100))
					+ (1.5 * leche);

			BigDecimal asufre;
			asufre = 2 * MS_Aporte;

			BigDecimal cobalto;
			cobalto = 0.11 * MS_Aporte;

			BigDecimal cobre;
			cobre = (0.0071 * pv) + 0.15 * leche;

			BigDecimal iodo;
			iodo = 1.5 * (pv / 100);

			BigDecimal hierro;
			hierro = leche;

			BigDecimal manganeso;
			manganeso = (0.002 * pv) + (0.03 * leche);

			BigDecimal zinc;
			zinc = (0.033 * pv) + (0.012 * pv) + (4 * leche);

			BigDecimal selenio;
			selenio = 0.3 * MS_Aporte;

			BigDecimal vit_a;
			vit_a = 0.11 * pv;

			BigDecimal vit_d;
			vit_d = 0.03 * pv;

			BigDecimal vit_e;
			vit_e = 0.08 * pv;

			BigDecimal fdn;
			fdn = getFdn_ordeñe(); // (select sum(kg_ms * (fdn/100)) as fdn from
									// alimentos where id_movi = id_movi)

			// se usan en vaca seca y recria
			BigDecimal er;
			diasg = 0;
			adpv = 0;
			er = 0;
			
          
			reqVacaOrdeñe.setIdtipoanimal(animal);
			reqVacaOrdeñe.setPv(pv);
			reqVacaOrdeñe.setLtsxdia(leche);
			reqVacaOrdeñe.setGb(gb);
			reqVacaOrdeñe.setPb(pb);
			reqVacaOrdeñe.setCamina(camina);
			reqVacaOrdeñe.setEstres(estres);
			reqVacaOrdeñe.setCw(cw);
			reqVacaOrdeñe.setDiasgestacion(diasg);
			reqVacaOrdeñe.setAdpv(adpv);
			reqVacaOrdeñe.setLc4(lc4);
			reqVacaOrdeñe.setLag(lag);
			reqVacaOrdeñe.setA1(a1);
			reqVacaOrdeñe.setEnactiv(enactiv);
			reqVacaOrdeñe.setEnmnt(enmnt);
			reqVacaOrdeñe.setEnstress(enstress);
			reqVacaOrdeñe.setEr(er);
			reqVacaOrdeñe.setEnleche(enleche);
			reqVacaOrdeñe.setEnl_total(enl_total);
			reqVacaOrdeñe.setCms(cms);
			reqVacaOrdeñe.setPdescepitelio(pdescepitelio);
			reqVacaOrdeñe.setPorinareq(porinareq);

			reqVacaOrdeñe.setPm_mnt(pm_mnt);
			reqVacaOrdeñe.setPm_lact(pm_lact);
			reqVacaOrdeñe.setPm_total(pm_total);
			reqVacaOrdeñe.setPdr_req(pdr_req);
			reqVacaOrdeñe.setPorce_conce(porce_conce);
			reqVacaOrdeñe.setTdn_1(tdn_1);
			reqVacaOrdeñe.setCms_mnt(cms_mnt);
			reqVacaOrdeñe.setTdn_conc(tdn_conc);
			reqVacaOrdeñe.setDisc_var(disc_var);
			reqVacaOrdeñe.setDesc_var(desc_var);
			reqVacaOrdeñe.setTdn_act(tdn_act);
			reqVacaOrdeñe.setEd_cons(ed_cons);
			reqVacaOrdeñe.setEddesc_ms(eddesc_ms);
			reqVacaOrdeñe.setEe_ms(ee_ms);
			reqVacaOrdeñe.setEm_ms(em_ms);
			reqVacaOrdeñe.setEnl_ms(enl_ms);
			reqVacaOrdeñe.setEm_totalcons(EM_TotalCons);
			reqVacaOrdeñe.setEnl_totalcons(ENL_TotalCons);
			reqVacaOrdeñe.setMcp_total(mcp_total);
			reqVacaOrdeñe.setPct(PCt);
			reqVacaOrdeñe.setKpc(KPc);
			reqVacaOrdeñe.setKpf(KPf);
			reqVacaOrdeñe.setRdpx_forr(rdpx_forr);
			reqVacaOrdeñe.setRdpx_forr2(rdpx_forr2);
			reqVacaOrdeñe.setRdpx_conc(rdpx_conc);
			reqVacaOrdeñe.setRdpx_conc2(rdpx_conc2);
			reqVacaOrdeñe.setRdp(RDP);
			reqVacaOrdeñe.setRup(rup);
			reqVacaOrdeñe.setMs_aporte(MS_Aporte);
			reqVacaOrdeñe.setPfecalmet(PFecalMet);
			reqVacaOrdeñe.setPmendo(PMEndo);
			reqVacaOrdeñe.setCALCIO(calcio);

			/**
			 * @animal, @pv, @leche, @gb, @pb, @del, @camina, @estres, @cw,
			 *          @diasg, @adpv, @lc4, @lag, @a1, @enactiv,
			 * @enmnt, @enstress, @er, @enleche,
			 * @enl_total, @cms, @pdescepitelio, @porinareq, @pm_mnt, @pm_lact,
			 *             @pm_total,
			 * @pdr_req, @porce_conce, @tdn_1, @cms_mnt, @tdn_conc, @disc_var,
			 *           @desc_var, @tdn_act,
			 * @ed_cons, @eddesc_ms, @ee_ms,
			 * @em_ms, @enl_ms, @em_totalcons, @enl_totalcons, @mcp_total, @pct,
			 *         @kpc, @kpf, @rdpx_forr, @rdpx_forr2,
			 * @rdpx_conc, @rdpx_conc2, @rdp, @rup, @ms_aporte, @pfecalmet,
			 *             @pmendo, @CALCIO,
			 * @fosforo, @magnesio,
			 * @sodio, @cloro, @potasio, @asufre, @cobalto, @cobre, @iodo,
			 *         @hierro, @manganeso, @zinc, @selenio, tdn @vit_a, @vit_d,
			 *         @vit_e, @fdn, @id_movi
			 */

/*			reqVacaOrdeñe.setFosforo(fosforo);
			reqVacaOrdeñe.setMagnesio(magnesio);
			reqVacaOrdeñe.setSodio(sodio);
			reqVacaOrdeñe.setCloro(cloro);
			reqVacaOrdeñe.setPotasio(potasio);
			reqVacaOrdeñe.setAsufre(asufre);
			reqVacaOrdeñe.setCobalto(cobalto);
			reqVacaOrdeñe.setCobre(cobre);
			reqVacaOrdeñe.setIodo(iodo);
			reqVacaOrdeñe.setHierro(hierro);
			reqVacaOrdeñe.setManganeso(manganeso);
			reqVacaOrdeñe.setZinc(zinc);
			reqVacaOrdeñe.setSelenio(selenio);
			reqVacaOrdeñe.setVit_a(vit_a);
			reqVacaOrdeñe.setVit_d(vit_d);
			reqVacaOrdeñe.setVit_e(vit_e);
			reqVacaOrdeñe.setFdn(fdn);

		} catch (Exception e) {
			// TODO: handle exception
		}

		// rellenar el resultado
*/		return reqVacaOrdeñe;

	}

	/**
	 * 	/*		If (CDec(Me.fdn.Text) - CDec(Me.n_fdn.Text)) > 0 Then 'para que no de error al dividir por cero
          tdFDN = Format(
(0.75 * ((CDec(Me.fdn.Text - Me.n_fdn.Text)) - CDec(Me.lign.Text)) * (1 - (CDec(Me.lign.Text) / (CDec(Me.fdn.Text) - CDec(Me.n_fdn.Text))) ^ 0.667)), "#,###,###.00")
      Else
          tdFDN = 0
      End If

      tdEE = Format((Me.ee.Text - 1) * 2.25, "#,###,###.00")
   
 If CDec(Me.pc.Text) > 0 Then

          tdPB = =EXP((-1,2*(Y32/N32)))*N32
          tdPB = Format(2.71828182845904 ^ ((-1.2 * (Me.nida.Text / Me.pc.Text))) * Me.pc.Text, "#,###,###.00")
      Else
          tdPB = 0
      End If

      tdCNF = Format(0.98 * (100 - ((Me.fdn.Text - Me.n_fdn.Text) + CDec(Me.pc.Text) + CDec(Me.ee.Text) + CDec(Me.cen.Text))) * CDec(Me.paf.Text), "#,###,###.00")
     
Me.ed.Text = Format((tdCNF * 0.042) + (tdFDN * 0.042) + (tdPB * 0.056) + (0.094 * (tdEE / 2.25)) - 0.3, "#,###,###.00")
      Me.tdn.Text = Format(tdCNF + tdPB + (tdEE) + tdFDN - 7, "#,###,###.00")

	 * @throws Exception 
	 */
	private void calculartd() throws Exception {
		BigDecimal resultado = BigDecimal.ZERO;
		if (listaIdMP != null && !listaIdMP.isEmpty()) {
			Iterator<MpDTO> i = listaIdMP.iterator();
			while(i.hasNext())
			{
			MpDTO dto = (MpDTO) i.next();
			if (dto != null) {
				
				MateriaPrima mp = dto.getMp();

				BigDecimal kg_ms = dto.getCantidad();
				ComponenteValor fdn_cv = mpService
						.getComponenteFromComposicion(mp, compService
								.getComponenteById(Constantes.componente.FDN));
				ComponenteValor n_fdn_cv = mpService
						.getComponenteFromComposicion(mp, compService
								.getComponenteById(Constantes.componente.N_FDN));

				BigDecimal fdn = fdn_cv.getCantidad();
				BigDecimal n_fdn = n_fdn_cv.getCantidad();

				BigDecimal valortdFDN = BigDecimal.valueOf(0);
				if((fdn.subtract(n_fdn).compareTo(BigDecimal.ZERO)) >= 1)
				{
					ComponenteValor lign_cv = mpService
							.getComponenteFromComposicion(mp, compService
									.getComponenteById(Constantes.componente.Lign));
					
					//TODO: supuestamente esto despende del tipo de energia
					//valor = 0.75 * ((fdn - n_fdn) - lign_cv.getCantidad()) * 
					//(1 - (java.lang.Math.pow( (lign_cv.getCantidad() / (fdn - n_fdn)),0.667)));
					BigDecimal valor1  = new BigDecimal("0.75").multiply(fdn.subtract(n_fdn).subtract(lign_cv.getCantidad()));
					BigDecimal valor2 = new BigDecimal(1).subtract(new BigDecimal(java.lang.Math.pow((lign_cv.getCantidad().divide(fdn.subtract(n_fdn), Constantes.presicion, Constantes.redondeomode)).doubleValue(),0.667)));
					valortdFDN = valor1.multiply(valor2);
					System.out.println("tdFDN "+valortdFDN.toString());
				}
			//		mpService.updateCV(Constantes.componente.tdFDN, valor, mp);
					
					ComponenteValor ee_cv = mpService
							.getComponenteFromComposicion(mp, compService
									.getComponenteById(Constantes.componente.EE));
					

					BigDecimal valortdEE = (ee_cv.getCantidad().subtract(new BigDecimal(1))).multiply(new BigDecimal("2.25"));
					System.out.println("tdEE "+valortdEE.toString());
					
		//			mpService.updateCV(Constantes.componente.EE, ee, mp);
					
					
					BigDecimal valortdPB = BigDecimal.ZERO;
					ComponenteValor pc_cv = mpService
							.getComponenteFromComposicion(mp, compService
									.getComponenteById(Constantes.componente.PC));
					ComponenteValor nida_cv = mpService
							.getComponenteFromComposicion(mp, compService
									.getComponenteById(Constantes.componente.NIDA));

					BigDecimal pc = pc_cv.getCantidad();
					BigDecimal nida = nida_cv.getCantidad();

					if((pc).compareTo(BigDecimal.ZERO) >= 1)
					{
						
						
						//TODO: supuestamente esto despende del tipo de energia
						
						BigDecimal valor1  = nida.divide(pc, Constantes.presicion, Constantes.redondeomode);
						BigDecimal valor2 = new BigDecimal(java.lang.Math.exp(valor1.multiply(new BigDecimal("-1.2")).doubleValue()));
						valortdPB = valor2.multiply(pc);
						System.out.println("tdPB "+valortdPB.toString());
					}
			//			mpService.updateCV(Constantes.componente.tdPB, valortdPB, mp);
					
					
					ComponenteValor cen_cv = mpService
							.getComponenteFromComposicion(mp, compService
									.getComponenteById(Constantes.componente.CEN));
					
					BigDecimal cen = cen_cv.getCantidad();
					
					ComponenteValor paf_cv = mpService
							.getComponenteFromComposicion(mp, compService
									.getComponenteById(Constantes.componente.PAF));
					
					BigDecimal paf = paf_cv.getCantidad();
					
					 BigDecimal valor3 = new BigDecimal("0.98");
					 BigDecimal valor4 = fdn.subtract(n_fdn);
					 BigDecimal valor5 = valor4.add(pc).add(ee_cv.getCantidad()).add(cen);
					 BigDecimal valor6 = (new BigDecimal(100)).subtract(valor5);
					 BigDecimal valortdCNF = valor3.multiply(valor6).multiply(paf);
					 
					 System.out.println("tdCNF "+valortdCNF.toString());
				
/*
					 bigdecimal    valortdCNF = Format(0.98 * 
					 (100 - ((Me.fdn.Text - Me.n_fdn.Text) + CDec(Me.pc.Text) + CDec(Me.ee.Text) + CDec(Me.cen.Text)))
					  * CDec(Me.paf.Text),
					  *  "#,###,###.00")
					     
					Ed = Format((tdCNF * 0.042) + (tdFDN * 0.042) + (tdPB * 0.056) + (0.094 * (tdEE / 2.25)) - 0.3, "#,###,###.00")
					 TDN= Format(tdCNF + tdPB + (tdEE) + tdFDN - 7, "#,###,###.00")
					      */
					 BigDecimal valor11 = new BigDecimal("0.094");
					 BigDecimal valor7 = valortdCNF.multiply(new BigDecimal("0.042"));
					 BigDecimal valor8 = valortdFDN.multiply(new BigDecimal("0.042"));
					 BigDecimal valor9 = valortdPB.multiply(new BigDecimal("0.056"));
					 BigDecimal valor10 = valor11.multiply(valortdEE.divide(new BigDecimal("2.25"), Constantes.presicion, Constantes.redondeomode));
					 BigDecimal eD = valor7.add(valor8).add(valor9).add(valor10).subtract(new BigDecimal("0.3"));
					 BigDecimal tDN= valortdCNF.add(valortdPB).add(valortdEE).add(valortdFDN).subtract(new BigDecimal(7));
					
					
					 mpService.updateCV(Constantes.componente.ED, eD, mp);
					 mpService.updateCV(Constantes.componente.TDN, tDN, mp);
					 
					 System.out.println("ED "+eD.toString());
					 
					 System.out.println("TDN "+tDN.toString());
					 
					 
			}
		}
		}
		
		
	}

	/**
	 * (select sum(kg_ms * (fdn/100)) as fdn from alimentos where id_movi =
	 * id_movi) return
	 */
	private BigDecimal getFdn_ordeñe() throws Exception {

		BigDecimal resultado = BigDecimal.ZERO;
		if (listaIdMP != null && !listaIdMP.isEmpty()) {
			Iterator<MpDTO> i = listaIdMP.iterator();
			while(i.hasNext())
			{
			MpDTO dto = (MpDTO) i.next();
			if (dto != null) {
				Integer id = dto.getMp().getId();

				MateriaPrima mp = mpService.getMateriaPrimaById(id);

				BigDecimal kg_ms = dto.getCantidad();
				ComponenteValor fdn_cv = mpService
						.getComponenteFromComposicion(mp, compService
								.getComponenteById(Constantes.componente.FDN));

				BigDecimal fdn = fdn_cv.getCantidad().divide(new BigDecimal(100), Constantes.presicion, Constantes.redondeomode);

				resultado = resultado.add(kg_ms.multiply(fdn));

			}
			}
		}
		return resultado;
	}

	/**
	 * (select SUM((KG_MS * PC/100)*(PC_a+PC_b*(kd/(kd+KPf)))*10) from alimentos
	 * where id_movi = id_movi) param kPf param listaIdMP2 return
	 */
	private BigDecimal getRDP_ordeñe(BigDecimal kpf) throws Exception {

		BigDecimal rdp = BigDecimal.ZERO;

		if (listaIdMP != null && !listaIdMP.isEmpty()) {
			Iterator<MpDTO> i = listaIdMP.iterator();
			while(i.hasNext())
			{
			MpDTO dto = (MpDTO) i.next();
			if (dto != null) {
				Integer id = dto.getMp().getId();

				MateriaPrima mp = mpService.getMateriaPrimaById(id);

				BigDecimal kg_ms = dto.getCantidad();
				ComponenteValor pc_cv = mpService
						.getComponenteFromComposicion(mp, compService
								.getComponenteById(Constantes.componente.PC));
				ComponenteValor pc_a_cv = mpService
						.getComponenteFromComposicion(mp, compService
								.getComponenteById(Constantes.componente.PC_a));
				ComponenteValor pc_b_cv = mpService
						.getComponenteFromComposicion(mp, compService
								.getComponenteById(Constantes.componente.PC_b));
				ComponenteValor kd_cv = mpService
						.getComponenteFromComposicion(mp, compService
								.getComponenteById(Constantes.componente.Kd));

				BigDecimal pc = pc_cv.getCantidad();
				BigDecimal pc_a = pc_a_cv.getCantidad();
				BigDecimal pc_b = pc_b_cv.getCantidad();
				BigDecimal kd = kd_cv.getCantidad();

				//rdp = rdp+ ((kg_ms * pc / 100)	* (pc_a + pc_b * (kd / (kd + kpf))) * 10);
				rdp = rdp.add(((kg_ms.multiply(pc)).divide(new BigDecimal(100), Constantes.presicion, Constantes.redondeomode)).multiply((pc_a.add(pc_b.multiply(kd.divide(kd.add(kpf), Constantes.presicion, Constantes.redondeomode)))).multiply(new BigDecimal(10))));
				
			}
			}
		}
		return rdp;
	}

	/**
	 * (select sum(kg_ms * pc) * 10 from alimentos where id_movi = id_movi)
	 * param listaIdMP2 return
	 */
	private BigDecimal getPct_ordeñe() throws Exception {

		BigDecimal resultado =BigDecimal.ZERO;
		if (listaIdMP != null && !listaIdMP.isEmpty()) {
			Iterator<MpDTO> i = listaIdMP.iterator();
			while(i.hasNext())
			{
			MpDTO dto = (MpDTO) i.next();
			if (dto != null) {
				Integer id = dto.getMp().getId();

				MateriaPrima mp = mpService.getMateriaPrimaById(id);

				BigDecimal kg_ms = dto.getCantidad();
				ComponenteValor pc_cv = mpService
						.getComponenteFromComposicion(mp, compService
								.getComponenteById(Constantes.componente.PC));

				BigDecimal pc = pc_cv.getCantidad();

				resultado = resultado.add(kg_ms.multiply(pc).multiply(new BigDecimal(10))); 

			}
			}
		}
		return resultado;
	}

	/**
	 * (select sum(kg_ms * ee) / sum(kg_ms) from alimentos where id_movi =
	 * id_movi) param listaIdMP2 return
	 * 
	 * @throws Exception
	 */
	private BigDecimal getEe_ms_Ordeñe() throws Exception {

		BigDecimal resultado = BigDecimal.ZERO;
		BigDecimal kg_m_total = BigDecimal.ZERO;
		if (listaIdMP != null && !listaIdMP.isEmpty()) {
			Iterator<MpDTO> i = listaIdMP.iterator();
			while(i.hasNext())
			{
			MpDTO dto = (MpDTO) i.next();
			if (dto != null) {
				Integer id = dto.getMp().getId();

				MateriaPrima mp = mpService.getMateriaPrimaById(id);

				BigDecimal kg_ms = dto.getCantidad();

				ComponenteValor ee_cv = mpService
						.getComponenteFromComposicion(mp, compService
								.getComponenteById(Constantes.componente.EE));

				BigDecimal ee = ee_cv.getCantidad();

				resultado = resultado.add(kg_ms.multiply(ee)); 
				kg_m_total = kg_m_total.add(kg_ms);

			}
			}
		}
		if (kg_m_total.compareTo(BigDecimal.ZERO) > 0)
			resultado = resultado.divide(kg_m_total, Constantes.presicion, Constantes.redondeomode);

		return resultado;
	}

	private RequerimientosNrcDTO seca() throws Exception {

		RequerimientosNrcDTO reqVacaSeca = new RequerimientosNrcDTO();

		/*
		 try {
		
			BigDecimal valor = new BigDecimal("0.066");
			// peso ternero al nacimineto
			BigDecimal cbw = pv * valor;

			// Peso del feto al dia de gestación

			// cw = 18+((diasg - 190)*0.665))*(cbw/45);

			BigDecimal valor1 = new BigDecimal("0.665");

			cw = (18 + ((diasg - 190) * valor1)) * (cbw / 45);

			// EM requerida para preñez
			// ((2*0,00159*B55-0,0352)*(37/45))/0,14

			BigDecimal empreg = (((2 * 0.00159 * diasg) - 0.0352) * (cbw / 45)) / 0.14;

			// Energia neta que gasta para actividad

			BigDecimal enactiv = (camina * 0.00045 * pv) + (0.0012 * pv);

			// energia neta de mantenimiento

			BigDecimal enmnt = java.lang.Math.pow(pv, 0.75) * 0.08;

			// estres

			BigDecimal enstress = 0;

			if (estres == 1)

				enstress = 0;
			else if (estres == 2)

				enstress = 0.07;

			else
				// if (estres == 3)
				enstress = 0.18;

			// Energia neta de lactancia requerida por dia para todos los
			// procesos

			BigDecimal enl_total = empreg + enactiv + enmnt + enstress;

			BigDecimal cms = ((1.97 - (0.75 * java.lang.Math
					.exp(0.16 * (diasg - 280)))) / 100) * pv;

			// proteina

			BigDecimal pdescepitelio = 0.3 * java.lang.Math.pow(pv, 0.6);

			BigDecimal porinareq = 4.1 * java.lang.Math.pow(pv, 0.5);

			/*
			 * // sumatoria de los kg. de masa seca
			 * 
			 * mS_Aporte = (select sum(kg_ms) from alimentos where id_movi =
			 * id_movi);
			 */
			// // sumatoria de los kg. de alimentos
/*			BigDecimal mS_Aporte = getMS_Aporte();

			BigDecimal pmendo = ((11.8 * mS_Aporte) * 0.4) / 0.67;

			BigDecimal pmpreg = ((0.69 * diasg - 69.2) * (cbw / 45)) / 0.33;

			// // sumatoria de los kg. de alimentos concentrados

			// tot_concentrados = (select sum(kg_ms) from alimentos where
			// energia = 'Concentrado' and id_movi = id_movi) ;
			// // % de concentrados en la dieta que hacemos

			BigDecimal tot_concentrados = 0;
			try {
				tot_concentrados = getTotalConcenctrados();
			} catch (Exception e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}

			BigDecimal porce_conce = tot_concentrados / mS_Aporte * 100;

			// // Aporte de Total de nutrientes digestibles para mantenimiento,
			// kg/dia

			// tdn_1 = (select sum(kg_ms * tdn) from alimentos where id_movi =
			// id_movi) / 100;

			BigDecimal tdn_1 = 0;
			try {
				tdn_1 = getTDN() / 100;
			} catch (Exception e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}

			// // Consumo de Materia seca que usa solo para mantenerse, el resto
			// es para producir

			BigDecimal cms_mnt = tdn_1
					/ (0.035 * java.lang.Math.pow((pv * 0.96), 0.75));

			// // % que representa el TDN sobre el Aporte de MS

			BigDecimal tdn_conc = tdn_1 / mS_Aporte * 100;

			BigDecimal disc_var = ((0.18 * tdn_conc) - 10.3) * (cms_mnt - 1);

			BigDecimal desc_var = (tdn_conc - disc_var) / tdn_conc;

			// Aporte de TDN Real despues del descuento

			BigDecimal tdn_act = tdn_conc * desc_var;

			// sumatoria kg MS de alimento * Energia Digestible que aporta

			BigDecimal ed_cons = getEd(); // (select sum(kg_ms * ed) from alimentos
										// where id_movi = id_movi);

			// Energia Digestible Real con Descuento por kg materia seca

			BigDecimal eddesc_ms = (ed_cons / mS_Aporte) * desc_var;

			// sumatoria kg MS de alimento * Extracto etereo del alimento

			BigDecimal ee_ms = getEe_ms() / mS_Aporte; // (select sum(kg_ms * ee)
													// from alimentos where
													// id_movi = id_movi) /
													// mS_Aporte;

			BigDecimal em_ms = (1.01 * eddesc_ms - 0.45) + (0.0046 * (ee_ms - 1));

			BigDecimal enl_ms = (0.703 * em_ms) - 0.19;

			// Consumo total de energía Metabolizable, Mcal/día

			BigDecimal em_totalcons = mS_Aporte * em_ms;

			// Consumo total de energía Neta de lactancia, Mcal/día

			BigDecimal enl_totalcons = mS_Aporte * enl_ms;

			// porte de PM microbiana dietaria

			BigDecimal mcp_total = 0.13 * (tdn_1 * desc_var) * 1000;

			BigDecimal pdr_req = mcp_total * 1.18;

			BigDecimal pfecalmet = (mS_Aporte * 30) - 0.5
					* (((mcp_total * .64) / 0.8) - (mcp_total * .64));

			BigDecimal pm_mnt = pdescepitelio + porinareq + pfecalmet + pmendo
					+ pmpreg;

			BigDecimal pm_total = pm_mnt;

			// //---OJO PREGUNTAR

			BigDecimal pct = getPct() * 10; // (select sum(kg_ms * pc) from
										// alimentos where id_movi = id_movi) *
										// 10;

			BigDecimal kpc = 2.904 + (1.375 * cms_mnt) - (0.02 * porce_conce);

			BigDecimal kpf = 3.054 + (0.614 * cms_mnt);

			// --------- Calculo rdp ----------------

			BigDecimal rdp = 0;

			try {
				rdp = getRDP(kpf);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

			// ------- fin cálculo rdp ------------

			BigDecimal rup = pct - rdp;

			BigDecimal exp1 = java.lang.Math.exp((0.05581 - (0.00007 * diasg))
					* diasg);
			BigDecimal exp2 = java.lang.Math
					.exp((0.05581 - (0.00007 * (diasg - 1))) * (diasg - 1));

			// Minerales
			BigDecimal calcio = (1.54 * (pv / 100)) + (0.08 * (pv / 100)) + 0.02456
					* exp1 - 0.02456 * exp2;

			BigDecimal exp3 = java.lang.Math
					.exp(((0.05527 - (0.000075 * diasg)) * diasg));
			BigDecimal exp4 = java.lang.Math
					.exp(((0.05527 - (0.000075 * (diasg - 1))) * (diasg - 1)));

			BigDecimal fosforo = 1 * cms + 0.002 * pv + 0.02743 * exp3 - 0.02743
					* exp4;

			BigDecimal magnesio = (0.003 * pv) + 0.33;

			BigDecimal sodio = (0.015 * pv) + 1.39;

			BigDecimal cloro = (2.25 * (pv / 100)) + 1;

			BigDecimal potasio = (2.6 * cms) + 1.027;

			BigDecimal asufre = 2 * cms;

			BigDecimal cobalto = 0.11 * cms;

			BigDecimal cobre = (0.0071 * pv) + 2;

			BigDecimal iodo = 0.6 * (pv / 100);

			BigDecimal hierro = 18;

			BigDecimal manganeso = (0.002 * pv) + 0.3;

			BigDecimal zinc = (0.033 * pv) + (0.012 * pv) + 12;

			BigDecimal selenio = 0.3 * cms;

			BigDecimal vit_a = 0.11 * pv;

			BigDecimal vit_d = 0.03 * pv;

			BigDecimal vit_e = 1.6 * pv;

			BigDecimal fdn = getFdn(); // (select sum(kg_ms * (fdn/100)) as fdn from
									// alimentos where id_movi = id_movi);

			// // estas son variables que se usan en ordeñe
			BigDecimal a1, lag, lc4, enleche, pm_lact;
			BigDecimal rdpx_forr, rdpx_forr2, rdpx_conc, rdpx_conc2;
			BigDecimal er;
			a1 = 0;
			lag = 0;
			lc4 = 0;
			enleche = 0;
			pm_lact = 0;
			rdpx_forr = 0;
			rdpx_forr2 = 0;
			rdpx_conc = 0;
			rdpx_conc2 = 0;
			adpv = 0;
			er = 0;

			// TODO: creo que esto no iria ya que en el proceso .net lo hacia para 
			//mantener los datos en la misma tabla de los resultados
			reqVacaSeca.setIdtipoanimal(animal);
			reqVacaSeca.setPv(pv);
			reqVacaSeca.setLtsxdia(leche);
			reqVacaSeca.setGb(gb);
			reqVacaSeca.setPb(pb);
			reqVacaSeca.setCamina(camina);
			reqVacaSeca.setEstres(estres);
			reqVacaSeca.setCw(cw);
			reqVacaSeca.setDiasgestacion(diasg);
			reqVacaSeca.setAdpv(adpv);
			// TODO: hasta aca creo que no va

			// a estos los guarda con 0
			reqVacaSeca.setLc4(lc4);
			reqVacaSeca.setLag(lag);
			reqVacaSeca.setA1(a1);
			reqVacaSeca.setEnleche(enleche);
			reqVacaSeca.setPm_lact(pm_lact);
			reqVacaSeca.setRdpx_forr(rdpx_forr);
			reqVacaSeca.setRdpx_forr2(rdpx_forr2);
			reqVacaSeca.setRdpx_conc(rdpx_conc);
			reqVacaSeca.setRdpx_conc2(rdpx_conc2);
			reqVacaSeca.setEr(er);

			reqVacaSeca.setEnactiv(enactiv);
			reqVacaSeca.setEnmnt(enmnt);
			reqVacaSeca.setEnstress(enstress);

			reqVacaSeca.setEnl_total(enl_total);
			reqVacaSeca.setCms(cms);
			reqVacaSeca.setPdescepitelio(pdescepitelio);
			reqVacaSeca.setPorinareq(porinareq);

			reqVacaSeca.setPm_mnt(pm_mnt);

			reqVacaSeca.setPm_total(pm_total);
			reqVacaSeca.setPdr_req(pdr_req);
			reqVacaSeca.setPorce_conce(porce_conce);
			reqVacaSeca.setTdn_1(tdn_1);
			reqVacaSeca.setCms_mnt(cms_mnt);
			reqVacaSeca.setTdn_conc(tdn_conc);
			reqVacaSeca.setDisc_var(disc_var);
			reqVacaSeca.setDesc_var(desc_var);
			reqVacaSeca.setTdn_act(tdn_act);
			reqVacaSeca.setEd_cons(ed_cons);
			reqVacaSeca.setEddesc_ms(eddesc_ms);
			reqVacaSeca.setEe_ms(ee_ms);
			reqVacaSeca.setEm_ms(em_ms);
			reqVacaSeca.setEnl_ms(enl_ms);
			reqVacaSeca.setEm_totalcons(em_totalcons);
			reqVacaSeca.setEnl_totalcons(enl_totalcons);
			reqVacaSeca.setMcp_total(mcp_total);
			reqVacaSeca.setPct(pct);
			reqVacaSeca.setKpc(kpc);
			reqVacaSeca.setKpf(kpf);

			reqVacaSeca.setRdp(rdp);
			reqVacaSeca.setRup(rup);

			// TODO: ver si esto esta bien?
			reqVacaSeca.setMs_aporte(mS_Aporte);

			reqVacaSeca.setPfecalmet(pfecalmet);
			reqVacaSeca.setPmendo(pmendo);
			reqVacaSeca.setCALCIO(calcio);

			reqVacaSeca.setFosforo(fosforo);
			reqVacaSeca.setMagnesio(magnesio);
			reqVacaSeca.setSodio(sodio);
			reqVacaSeca.setCloro(cloro);
			reqVacaSeca.setPotasio(potasio);
			reqVacaSeca.setAsufre(asufre);
			reqVacaSeca.setCobalto(cobalto);
			reqVacaSeca.setCobre(cobre);
			reqVacaSeca.setIodo(iodo);
			reqVacaSeca.setHierro(hierro);
			reqVacaSeca.setManganeso(manganeso);
			reqVacaSeca.setZinc(zinc);
			reqVacaSeca.setSelenio(selenio);
			reqVacaSeca.setVit_a(vit_a);
			reqVacaSeca.setVit_d(vit_d);
			reqVacaSeca.setVit_e(vit_e);
			reqVacaSeca.setFdn(fdn);

		} catch (Exception e) {
			// TODO: handle exception
			throw e;
		}*/

		// TODO rellenar el dato a devolver
		return reqVacaSeca;

	}

	/**
	 * (select sum(kg_ms * (fdn/100)) as fdn from alimentos where id_movi =
	 * id_movi); param listaIdMP return throws Exception
	 */
	private BigDecimal getFdn() throws Exception {

		BigDecimal resultado = BigDecimal.ZERO;
		if (listaIdMP != null && !listaIdMP.isEmpty()) {
			Iterator<MpDTO> i = listaIdMP.iterator();
			while(i.hasNext())
			{
			MpDTO dto = (MpDTO) i.next();
			if (dto != null) {
				Integer id = dto.getMp().getId();

				MateriaPrima mp = mpService.getMateriaPrimaById(id);

				BigDecimal kg_ms = dto.getCantidad();
				ComponenteValor fdn_cv = mpService
						.getComponenteFromComposicion(mp, compService
								.getComponenteById(Constantes.componente.FDN));

				BigDecimal fdn = fdn_cv.getCantidad().divide(new BigDecimal(100), Constantes.presicion, Constantes.redondeomode);

				resultado = resultado.add(kg_ms.multiply(fdn)); 
			}
			}
		}
		return resultado;
	}
	
	/**
	 * (select sum(kg_ms * (fdn/100)) as fdn from alimentos where id_movi =
	 * id_movi); param listaIdMP return throws Exception
	 */
	public BigDecimal getFdn(MpDTO dto) throws Exception {

		BigDecimal resultado = BigDecimal.ZERO;
		if (dto != null && dto.getMp() != null) {

				MateriaPrima mp = dto.getMp();

				BigDecimal kg_ms = dto.getCantidad();
				ComponenteValor fdn_cv = mpService
						.getComponenteFromComposicion(mp, compService
								.getComponenteById(Constantes.componente.FDN));

				BigDecimal fdn = fdn_cv.getCantidad().divide(new BigDecimal(100), Constantes.presicion, Constantes.redondeomode);

				resultado = resultado.add(kg_ms.multiply(fdn)); 
			}
		
		return resultado;
	}

	/**
	 * /(select sum(kg_ms * pc) from alimentos where id_movi = id_movi) ;
	 * 
	 * param listaIdMP return throws Exception
	 */
	private BigDecimal getPct() throws Exception {

		BigDecimal resultado = BigDecimal.ZERO;
		if (listaIdMP != null && !listaIdMP.isEmpty()) {
			Iterator<MpDTO> i = listaIdMP.iterator();
			while(i.hasNext())
			{
			MpDTO dto = (MpDTO) i.next();
			if (dto != null) {
				Integer id = dto.getMp().getId();

				MateriaPrima mp = mpService.getMateriaPrimaById(id);

				BigDecimal kg_ms = dto.getCantidad();
				ComponenteValor pc_cv = mpService
						.getComponenteFromComposicion(mp, compService
								.getComponenteById(Constantes.componente.PC));

				BigDecimal pc = pc_cv.getCantidad();

				resultado = resultado.add(kg_ms.multiply(pc)); 

			}}
			
		}
		return resultado;
	}

	/**
	 * 
	 * //(select sum(kg_ms * ee) from alimentos where id_movi = id_movi) ; param
	 * listaIdMP return throws Exception
	 */
	private BigDecimal getEe_ms() throws Exception {

		BigDecimal resultado = BigDecimal.ZERO;
		if (listaIdMP != null && !listaIdMP.isEmpty()) {
			Iterator<MpDTO> i = listaIdMP.iterator();
			while(i.hasNext())
			{
			MpDTO dto = (MpDTO) i.next();
			if (dto != null) {
				Integer id = dto.getMp().getId();

				MateriaPrima mp = mpService.getMateriaPrimaById(id);

				BigDecimal kg_ms = dto.getCantidad();
				ComponenteValor ee_cv = mpService
						.getComponenteFromComposicion(mp, compService
								.getComponenteById(Constantes.componente.EE));

				BigDecimal ee = ee_cv.getCantidad();

				resultado = resultado.add(kg_ms.multiply(ee));
			}
			}
		}
		return resultado;
	}

	/**
	 * sumatoria kg MS de alimento * Energia Digestible que aporta //(select
	 * sum(kg_ms * ed) from alimentos where id_movi = id_movi);
	 * 
	 * param listaIdMP return throws Exception
	 */
	private BigDecimal getEd() throws Exception {

		BigDecimal resultado = BigDecimal.ZERO;
		if (listaIdMP != null && !listaIdMP.isEmpty()) {
			Iterator<MpDTO> i = listaIdMP.iterator();
			while(i.hasNext())
			{
			MpDTO dto = (MpDTO) i.next();
			if (dto != null) {
				Integer id = dto.getMp().getId();

				MateriaPrima mp = mpService.getMateriaPrimaById(id);

				BigDecimal kg_ms = dto.getCantidad();
				ComponenteValor ed_cv = mpService
						.getComponenteFromComposicion(mp, compService
								.getComponenteById(Constantes.componente.ED));

				BigDecimal ed = ed_cv.getCantidad();

				resultado = resultado.add(kg_ms.multiply(ed)); 

			}}
		}
		return resultado;
	}

	/**
	 * 
	 * (select sum(kg_ms * tdn) from alimentos where id_movi = id_movi) ; param
	 * listaIdMP return throws Exception
	 */
	private BigDecimal getTDN() throws Exception {

		BigDecimal resultado = BigDecimal.ZERO;
		if (listaIdMP != null && !listaIdMP.isEmpty()) {
			Iterator<MpDTO> i = listaIdMP.iterator();
			while(i.hasNext())
			{
			MpDTO dto = (MpDTO) i.next();
			if (dto != null) {
				

				MateriaPrima mp = dto.getMp();

				BigDecimal kg_ms = dto.getCantidad();
				ComponenteValor tdn_cv = mpService
						.getComponenteFromComposicion(mp, compService
								.getComponenteById(Integer.valueOf(new Long(Constantes.componente.TDN).intValue())));

				BigDecimal tdn = tdn_cv.getCantidad();

				resultado = resultado.add(kg_ms.multiply(tdn));

			}}
		}
		return resultado;
	}

	/**
	 * (select sum(kg_ms) from alimentos where energia = 'Concentrado' and
	 * id_movi = id_movi) ; //// % de concentrados en la dieta que hacemos param
	 * listaIdMP return throws Exception
	 */
	private BigDecimal getTotalConcenctrados() throws Exception {

		BigDecimal kg_ms = BigDecimal.ZERO;

		if (listaIdMP != null && !listaIdMP.isEmpty()) {
			Iterator<MpDTO> i = listaIdMP.iterator();
			while(i.hasNext())
			{
			MpDTO dto = (MpDTO) i.next();
			if (dto != null) {

				MateriaPrima mp = dto.getMp();
				
				 if(mp.getTipoEnergia().esConcentrado())
				 {
				   kg_ms =  kg_ms.add( dto.getCantidad());

				 }
			}
			}
		}
		return kg_ms;
	}

	/**
	 * mS_Aporte = (select sum(kg_ms) from alimentos where id_movi = id_movi);
	 * param listaIdMP = id de los mp = id de los alimentos return
	 */
	private BigDecimal getMS_Aporte() {

		BigDecimal resultado =BigDecimal.ZERO;
		if (listaIdMP != null && !listaIdMP.isEmpty()) {
			Iterator<MpDTO> i = listaIdMP.iterator();
			while(i.hasNext())
			{
			MpDTO mp = (MpDTO) i.next();
			if (mp != null) {

				resultado = resultado.add(mp.getCantidad());
			}}
		}
		return resultado;
	}

	private BigDecimal getRDP(BigDecimal kpf) throws Exception {

		BigDecimal rdp = BigDecimal.ZERO;

		if (listaIdMP != null && !listaIdMP.isEmpty()) {
			Iterator<MpDTO> i = listaIdMP.iterator();
			while(i.hasNext())
			{
			MpDTO dto = (MpDTO) i.next();
			if (dto != null) {
				Integer id = dto.getMp().getId();

				MateriaPrima mp = mpService.getMateriaPrimaById(id);

				BigDecimal kg_ms = dto.getCantidad();
				ComponenteValor pc_cv = mpService
						.getComponenteFromComposicion(mp, compService
								.getComponenteById(Constantes.componente.PC));
				ComponenteValor pc_a_cv = mpService
						.getComponenteFromComposicion(mp, compService
								.getComponenteById(Constantes.componente.PC_a));
				ComponenteValor pc_b_cv = mpService
						.getComponenteFromComposicion(mp, compService
								.getComponenteById(Constantes.componente.PC_b));
				ComponenteValor kd_cv = mpService
						.getComponenteFromComposicion(mp, compService
								.getComponenteById(Constantes.componente.Kd));

				BigDecimal pc = pc_cv.getCantidad();
				BigDecimal pc_a = pc_a_cv.getCantidad();
				BigDecimal pc_b = pc_b_cv.getCantidad();
				BigDecimal kd = kd_cv.getCantidad();

				//rdp = rdp + (kg_ms * pc / 100)	* (pc_a + pc_b * (kd / (kd + kpf))) * 10;
				rdp = rdp.add(((kg_ms.multiply(pc)).divide(new BigDecimal(100), Constantes.presicion, Constantes.redondeomode)).multiply((pc_a.add(pc_b.multiply(kd.divide(kd.add(kpf), Constantes.presicion, Constantes.redondeomode)))).multiply(new BigDecimal(10))));
			}
		}
		}

		// BigDecimal cur_rdp cursor;

		/*
		 * declare cur_rdp CURSOR FOR select kg_ms, pc, pc_a, pc_b, kd from
		 * alimentos where id_movi = id_movi;
		 * 
		 * OPEN cur_rdp; FETCH next from cur_rdp INTO kg_ms, pc, pc_a, pc_b, kd;
		 * 
		 * 
		 * //fetch next cur_rdp into
		 * 
		 * WHILE FETCH_STATUS = 0 begin rdp = rdp + ( KG_MS* PC/100)*( PC_a+
		 * PC_b*( kd/( kd+ KPf)))*10; FETCH cur_rdp into kg_ms, pc, pc_a, pc_b,
		 * kd; end
		 * 
		 * CLOSE cur_rdp;
		 * 
		 * DEALLOCATE cur_rdp;
		 */
		return rdp;
	}
	





}
